IMPLEMENTATION MODULE Tad_Curso;

FROM StrIO IMPORT WriteString, WriteLn,WriteString;  
FROM FIO IMPORT OpenToRead,Close,File,Exists,ReadString;
FROM DynamicStrings IMPORT String, ConCat, InitString,CopyOut, char, Index, Slice;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM NumberIO IMPORT ReadInt,WriteInt;
FROM StringConvert IMPORT StringToInteger, IntegerToString;
FROM IO IMPORT Write;

FROM Tad_Materia IMPORT Materia, GetCodigo, GetNombre;
FROM Tad_Lista IMPORT Lista_Tamanio, Lista_Obtener;

TYPE Curso = POINTER TO Cur;

TYPE Cur = RECORD
			codigo_materia : INTEGER;
			seccion : INTEGER;
			tipo: CHAR;
			cupo: INTEGER;
			END;

PROCEDURE Nuevo (codigo:INTEGER; seccion:INTEGER; tipo:CHAR; cupo:INTEGER) : Curso;
VAR materia : Curso;
BEGIN
	NEW(materia);
	
	IF (materia = NIL) THEN
		RETURN NIL;
	END;
	materia^.codigo_materia := codigo;
	materia^.seccion := seccion;
	materia^.tipo := tipo;
	materia^.cupo :=  cupo;
	RETURN materia;
	
END Nuevo;

PROCEDURE AsigCodigoMateria (VAR materia : Curso; codigo : INTEGER);
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
	END;
	
	materia^.codigo_materia := codigo;
	
END AsigCodigoMateria;

PROCEDURE AsigSeccion (VAR materia : Curso; seccion : INTEGER);
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
	END;
	
	materia^.seccion := seccion;
	
END AsigSeccion;

PROCEDURE AsigTipo (VAR materia : Curso; tipo : CHAR);
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
	END;
	
	materia^.tipo := tipo;
	
END AsigTipo;

PROCEDURE AsigCupo (VAR materia : Curso; cupo : INTEGER);
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
	END;
	
	materia^.cupo := cupo;
	
END AsigCupo;

PROCEDURE GetCodigoMateria (materia : Curso) : INTEGER;
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
		RETURN 0;
	END;
	
	RETURN materia^.codigo_materia;
	
END GetCodigoMateria;

PROCEDURE GetSeccion (materia : Curso) : INTEGER;
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
		RETURN 0;
	END;
	
	RETURN materia^.seccion;
	
END GetSeccion;

PROCEDURE GetTipo (materia : Curso) : CHAR;
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
	END;
	
	RETURN materia^.tipo;
	
END GetTipo;

PROCEDURE GetCupo (materia : Curso) : INTEGER;
BEGIN

	IF materia = NIL THEN
		WriteLn();
		WriteString('el elemento apunta a una caja vacia');
		RETURN 0;
	END;
	
	RETURN materia^.cupo;
	
END GetCupo;


PROCEDURE Carga(data:File) : Curso;

VAR materia : Curso;
VAR valido : BOOLEAN;
VAR string,tipo  : String;
VAR codigoMateria, seccion, cupo: INTEGER;
VAR linea : ARRAY [0..200] OF CHAR;
VAR inic,fin,i : CARDINAL;

BEGIN
	
	valido := TRUE;
	inic := 0;
	ReadString(data,linea);
	string := InitString(linea);
	fin := Index(string,":",inic);
	codigoMateria := StringToInteger(Slice(string,inic,fin),10,valido);
	inic := fin + 1;
	fin := Index(string,":",inic);
	seccion := StringToInteger(Slice(string,inic,fin),10,valido);
	inic := fin + 1;
	fin := Index(string,":",inic);
	tipo := Slice(string,inic,fin);
	inic := fin + 1;
	fin := 0;
	cupo := StringToInteger(Slice(string,inic,fin),10,valido);
	materia := Nuevo(codigoMateria,seccion,char(tipo,0),cupo);
	RETURN materia;
	
END Carga;

PROCEDURE Imprimir(materia : Curso);
BEGIN
	WriteLn();
	WriteString('(');
	WriteString('CodigoMateria:');
	WriteInt(GetCodigoMateria(materia),0);
	WriteString('Seccion:');
	WriteInt(GetSeccion(materia),0);
	WriteString('Tipo');
	Write(GetTipo(materia));
	WriteString(',Cupos:');
	WriteInt(GetCupo(materia),0);
	WriteString(')');
	WriteLn();
END Imprimir;

PROCEDURE CursoToString(curso:Curso; materias : Lista): String;
VAR i	   			:CARDINAL;
	asig   			:Materia;
	nombre, info 	:String;
	
		
BEGIN
	info := InitString('');
	FOR i := 0 TO Lista_Tamanio(materias)-1 DO 
		asig := Lista_Obtener(materias,i);
		IF GetCodigoMateria(curso) = GetCodigo(asig) THEN
			nombre:= GetNombre(asig);
			info:=ConCat(info,IntegerToString(GetCodigo(asig),1,"",FALSE,10,FALSE));
			info:=ConCat(info,InitString(' '));
			info:=ConCat(info,nombre);
			info:=ConCat(info,InitString(' '));
			info:=ConCat(info,IntegerToString(GetSeccion(curso),1,"",FALSE,10,FALSE));
		END;
	END;		
	RETURN info;
END CursoToString;

END Tad_Curso.
